{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "94c7fc38",
   "metadata": {},
   "source": [
    "# Chapter-1 大模型介绍与环境配置"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a18b1583",
   "metadata": {},
   "source": [
    "本节学习内容大纲\n",
    "\n",
    "- 大模型基本概念\n",
    "  - NLP的传统任务有哪些？\n",
    "  - 什么是大模型？\n",
    "- 大模型与传统NLP模型（Bert）有什么不同？\n",
    "- 动手实践\n",
    "  - 服务器环境配置（transformers, modelscope）\n",
    "  - 模型下载（Hugging Face, ModelScope）"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3f44441c",
   "metadata": {},
   "source": [
    "大家好，\n",
    "\n",
    "欢迎来到大模型使用和学习的入门课程。这门课是为像你们一样，刚刚踏入计算机科学领域的同学设计的。我们不会讲非常复杂的理论，而是从最实际的角度出发，带大家了解什么是大模型，以及如何动手使用它们。\n",
    "\n",
    "今天，我们的主要任务有两个：***第一，建立对大模型的基本认知；第二，把我们将来做实验要用的计算机环境配置好。***"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1854f36f",
   "metadata": {},
   "source": [
    "## 1.1 大模型基本概念"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "78fd3e3c",
   "metadata": {},
   "source": [
    "在我们直接进入“大模型”这个话题之前，我们先花几分钟了解一下它所属的领域：自然语言处理（NLP）。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2f4086f7",
   "metadata": {},
   "source": [
    "### 1.1.1 NLP的传统任务有哪些？\n",
    "\n",
    "NLP，Natural Language Processing，自然语言处理，是人工智能的一个分支，它的目标是让计算机能够理解、解释和生成人类语言。NLP 结合了计算机科学、人工智能、语言学和心理学等多个学科的知识和技术，旨在打破人类语言和计算机语言之间的障碍，实现无缝的交流与互动。\n",
    "\n",
    "在最近几年大模型火起来之前，NLP领域是由很多个“专项技能”组成的。就像一个公司里有管财务的，有管销售的，有管人事的，各司其职。\n",
    "\n",
    "传统的NLP任务主要有下面这些，我举几个大家可能接触过的例子：\n",
    "\n",
    "- 文本分类 (Text Classification): 给一段文本打上预设的标签。\n",
    "```\n",
    "例子1：垃圾邮件识别。 你的邮箱自动把一封邮件识别为“垃圾邮件”或“正常邮件”。\n",
    "例子2：情感分析。 分析一条电影评论“这部电影太棒了，演员演技都在线！”的情感是“正面”的，还是“负面”的。\n",
    "```\n",
    "\n",
    "- 命名实体识别 (Named Entity Recognition, NER): 从文本中找出特定信息，比如人名、地名、组织机构名等。\n",
    "```\n",
    "例子： “史蒂夫·乔布斯在加利福尼亚州的库比蒂诺创立了苹果公司。”\n",
    "这个任务会识别出：史蒂夫·乔布斯 (人名)，加利福尼亚州 (地名)，库比蒂诺 (地名)，苹果公司 (组织机构名)。这在信息提取、构建知识图谱时非常有用。\n",
    "```\n",
    "\n",
    "- 机器翻译 (Machine Translation): 把一种语言自动翻译成另一种语言。\n",
    "```\n",
    "例子： 这个大家最熟悉，比如把 \"Hello, world!\" 翻译成 “你好，世界！”。\n",
    "```\n",
    "\n",
    "- 问答系统 (Question Answering): 给定一个问题和一段背景材料，让机器从中找出答案。\n",
    "```\n",
    "例子： 背景材料是某产品的说明书，你提问：“这款手机的电池容量是多少？”，系统能准确回答：“5000mAh”。\n",
    "```\n",
    "\n",
    "> 注：如果想要更详细的了解NLP的任务，可参考 [Happy-LLM Chapter-1 NLP 基础概念](https://github.com/datawhalechina/happy-llm/blob/main/docs/chapter1/%E7%AC%AC%E4%B8%80%E7%AB%A0%20NLP%E5%9F%BA%E7%A1%80%E6%A6%82%E5%BF%B5.md)\n",
    "\n",
    "在过去，要完成上面任何一个任务，我们通常都需要一个专门为此任务训练的模型。一个做翻译的模型，基本不会做情感分析。这就是传统NLP模型的工作模式：**专业，一模一用**。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "065d297f",
   "metadata": {},
   "source": [
    "### 1.1.2 什么是大模型\n",
    "\n",
    "那么，什么是大模型（Large Language Model, LLM）呢？从字面上理解，“大”是它最直观的特点。这个“大”体现在两个方面：\n",
    "\n",
    "- 参数规模大： 模型的参数量巨大，通常从 70亿（7B） 级别起步，到现在已经有千亿、万亿 （DeepSeek-R1：671B，GPT-4：约1.8T） 级别的模型。你可以把参数想象成模型大脑中的神经元连接点，连接点越多，模型就越“聪明”，能记住和学习的知识就越多。\n",
    "- 训练数据量大： 大模型通常使用了海量的文本数据进行训练，这些数据可能包含了互联网上大部分高质量的公开文本。\n",
    "\n",
    "但大模型不仅仅是“大”而已。它是一种通用的、预训练过的语言模型。它在训练时，目标非常单纯：根据前面的内容，预测下一个最可能出现的词（token）是什么。\n",
    "\n",
    "> 注：token 是指模型能够识别的最小单位，比如一个单词、一个标点符号等。在大模型的训练中，模型会将文本中的每个 token 都映射成一个数字，然后模型会根据这些数字来预测下一个最可能出现的 token。\n",
    "\n",
    "通过在海量数据上日复一日地做这个“完形填空”或“接龙”游戏，模型慢慢学会了语法、事实知识、逻辑推理，甚至某种程度上的“世界观”。因为它学的知识是通用的，所以它不再是上面提到的“专才”，而更像一个**“通才”**。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c2fab20e",
   "metadata": {},
   "source": [
    "### 1.1.3 大模型与传统NLP模型（如BERT）有什么不同？\n",
    "\n",
    "为了让大家更清楚地理解这种变化，我们拿一个非常有代表性的传统NLP模型BERT，来和现在的大模型（比如 Qwen3 系列）做个对比。\n",
    "\n",
    "| 特性        | 传统 NLP 模型 (以 BERT 为例)         | 大语言模型 (以 Qwen3 系列为例)               |\n",
    "| --------- | ----------------------------- | -------------------------------- |\n",
    "| **模型规模**  | 亿级参数 (e.g., BERT-base: 1.1 亿) | 十亿到万亿级参数 (e.g., Qwen3-235B-A22B: 2350 亿)   |\n",
    "| **核心思想**  | 专业模式：针对特定任务进行微调 (Fine-tuning) | 通用模式：通过提示 (Prompting) 来解决各种任务    |\n",
    "| **使用方式**  | 需要在特定任务的数据集上进一步训练模型           | 基本不需要额外训练，直接通过给指令的方式使用           |\n",
    "| **任务灵活性** | 一个模型主要服务一个或少数几个任务             | 一个模型可以完成开放、多样的任务 (对话、写作、翻译、写代码等) |\n",
    "\n",
    "简单来说，最大的区别在于使用范式的改变：\n",
    "\n",
    "- BERT：像一个大学毕业生，基础不错（经过了预训练），但要胜任某个具体工作（比如情感分析），还需要岗前培训（用情感分析的数据集去微调）。\n",
    "- 大模型：像一个经验丰富的行业专家，你不需要再培训他。你只需要用自然语言给他下达指令（我们称之为“写提示词”），他就能直接开始工作。你想让他做情感分析，就问他“这段话是积极的还是消极的？”；你想让他翻译，就说“把这句话翻译成英文”。\n",
    "\n",
    "这种从“微调”到“提示”的转变，极大地降低了NLP技术的使用门槛，也是大模型如此强大的核心原因之一。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ac8dc3b8",
   "metadata": {},
   "source": [
    "## 1.2 环境配置\n",
    "\n",
    "概念部分我们先了解到这里。接下来，我们来做点实际操作。作为理工科专业的学生，动手能力是第一位的。我们将一步步配置好一个可以在服务器上运行大模型的基础环境。\n",
    "\n",
    "我们假设你已经有了一台 Linux 服务器的访问权限，并且这台服务器配备了 NVIDIA 的 GPU，并且已经安装好了可使用 CUDA 加速的 Pytorch。\n",
    "\n",
    "可以运行以下命令查看当前的 CUDA 版本：\n",
    "\n",
    "```bash\n",
    "!nvcc --version\n",
    "```\n",
    "\n",
    "可以运行以下命令查看当前的 Pytorch 版本：\n",
    "\n",
    "```bash\n",
    "!python -c \"import torch; print(torch.__version__)\"\n",
    "```\n",
    "\n",
    "测试一下 CUDA 是否可用：\n",
    "\n",
    "```bash\n",
    "!python -c \"import torch; print(torch.cuda.is_available())\"\n",
    "```\n",
    "\n",
    "如果输出 `True`，则说明 CUDA 已经成功配置。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0b26132e",
   "metadata": {},
   "outputs": [],
   "source": [
    "!nvcc --version"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9757fe0f",
   "metadata": {},
   "outputs": [],
   "source": [
    "!python -c \"import torch; print(torch.__version__)\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cc23a5ee",
   "metadata": {},
   "outputs": [],
   "source": [
    "!python -c \"import torch; print(torch.cuda.is_available())\""
   ]
  },
  {
   "cell_type": "markdown",
   "id": "744c6267",
   "metadata": {},
   "source": [
    "### 1.2.1 配置模型下载和运行环境"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "01f5b67e",
   "metadata": {},
   "source": [
    "Hugging Face 是全球最大的机器学习模型开源社区，提供了大量预训练模型、数据集和工具：\n",
    "\n",
    "- 拥有超过50万个开源模型\n",
    "- 提供完整的模型训练、部署和应用解决方案\n",
    "- 支持 Transformers、Diffusers 等主流框架\n",
    "- 有完善的文档和社区支持\n",
    "\n",
    "ModelScope 是阿里云推出的模型开源社区平台：\n",
    "\n",
    "- 提供中文生态下的各类AI模型\n",
    "- 包含NLP、CV、语音等多个领域的预训练模型\n",
    "- 支持一键部署和在线体验\n",
    "- 提供模型训练和推理的完整工具链\n",
    "\n",
    "接下来我们将介绍如何在这两个平台下载和使用预训练模型，大家可以任选自己喜欢的平台或方式下载模型～\n",
    "\n",
    "> Hugging Face : https://huggingface.co/  \n",
    "> ModelScope : https://www.modelscope.cn/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "91919932",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 配置 pip 镜像源\n",
    "!pip config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4ce64709",
   "metadata": {},
   "source": [
    "#### Hugging Face 下载模型\n",
    "\n",
    "使用`huggingface`官方提供的`huggingface-cli`命令行工具。安装依赖:\n",
    "\n",
    "```shell\n",
    "pip install -U huggingface_hub\n",
    "```\n",
    "\n",
    "然后新建python文件，填入以下代码，运行即可。\n",
    "\n",
    "- resume-download：断点续下\n",
    "- local-dir：本地存储路径。（linux环境下需要填写绝对路径）\n",
    "\n",
    "```python\n",
    "import os\n",
    "\n",
    "# 设置国内下载镜像地址\n",
    "os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'\n",
    "# 下载模型\n",
    "os.system('huggingface-cli download --resume-download Qwen/Qwen3-0.6B --local-dir your_path')\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "56f3539c",
   "metadata": {},
   "outputs": [],
   "source": [
    "!pip install -U -q huggingface_hub"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a8daf088",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "\n",
    "# 设置国内下载镜像地址\n",
    "os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'\n",
    "# 下载模型\n",
    "os.system('huggingface-cli download --resume-download Qwen/Qwen3-0.6B --local-dir /root/autodl-tmp/model/Qwen/Qwen3-0.6B')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "20523297",
   "metadata": {},
   "source": [
    "#### Modelscope\n",
    "\n",
    "使用`modelscope`中的`snapshot_download`函数下载模型，第一个参数为模型名称，参数`cache_dir`为模型的下载路径。\n",
    "\n",
    "注意：`cache_dir`最好为绝对路径。\n",
    "\n",
    "安装依赖：\n",
    "  \n",
    "```shell\n",
    "pip install modelscope\n",
    "pip install transformers\n",
    "```\n",
    "\n",
    "在当前目录下新建python文件，填入以下代码，运行即可。\n",
    "\n",
    "```python\n",
    "from modelscope import snapshot_download, AutoModel, AutoTokenizer\n",
    "\n",
    "model_dir = snapshot_download('Qwen/Qwen3-0.6B', cache_dir='your path', revision='master')\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4192dd36",
   "metadata": {},
   "outputs": [],
   "source": [
    "!pip install -q modelscope transformers accelerate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3a6f3de5",
   "metadata": {},
   "outputs": [],
   "source": [
    "from modelscope import snapshot_download, AutoModel, AutoTokenizer\n",
    "\n",
    "model_dir = snapshot_download('Qwen/Qwen3-0.6B', cache_dir='/root/autodl-tmp/model', revision='master')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "69281a07",
   "metadata": {},
   "source": [
    "接下来，我们使用 transformers 库来加载模型，并进行推理。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "60808da1",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 导入必要的transformers库组件\n",
    "from transformers import AutoModelForCausalLM, AutoTokenizer\n",
    "\n",
    "# 设置模型本地路径\n",
    "model_name = \"/root/autodl-tmp/model/Qwen/Qwen3-0___6B\"\n",
    "\n",
    "# 加载分词器和模型\n",
    "tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)\n",
    "model = AutoModelForCausalLM.from_pretrained(\n",
    "    model_name,\n",
    "    torch_dtype=\"auto\",  # 自动选择合适的数据类型\n",
    "    device_map=\"cuda:0\",    # 自动选择可用设备(CPU/GPU)\n",
    "    trust_remote_code=True\n",
    ")\n",
    "\n",
    "# 准备模型输入\n",
    "prompt = \"你好，请介绍一下自己\"\n",
    "messages = [\n",
    "    {\"role\": \"user\", \"content\": prompt}\n",
    "]\n",
    "text = tokenizer.apply_chat_template(\n",
    "    messages,\n",
    "    tokenize=False,\n",
    "    add_generation_prompt=True,\n",
    "    enable_thinking=True # 选择是否打开深度推理模式\n",
    ")\n",
    "# 将输入文本转换为模型可处理的张量格式\n",
    "model_inputs = tokenizer([text], return_tensors=\"pt\").to(model.device)\n",
    "\n",
    "# 生成文本\n",
    "generated_ids = model.generate(\n",
    "    **model_inputs,\n",
    "    max_new_tokens=32768  # 设置最大生成token数量\n",
    ")\n",
    "# 提取新生成的token ID\n",
    "output_ids = generated_ids[0][len(model_inputs.input_ids[0]):].tolist() \n",
    "\n",
    "# 解析思考内容\n",
    "try:\n",
    "    # rindex finding 151668 (</think>)\n",
    "    # 查找结束标记\"</think>\"的位置\n",
    "    index = len(output_ids) - output_ids[::-1].index(151668)\n",
    "except ValueError:\n",
    "    index = 0\n",
    "\n",
    "# 解码思考内容和最终回答\n",
    "thinking_content = tokenizer.decode(output_ids[:index], skip_special_tokens=True).strip(\"\\n\")\n",
    "content = tokenizer.decode(output_ids[index:], skip_special_tokens=True).strip(\"\\n\")\n",
    "\n",
    "# 打印结果\n",
    "print(\"thinking content:\", thinking_content)\n",
    "print(\"content:\", content)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "106bbf00",
   "metadata": {},
   "source": [
    "## 课后作业\n",
    "\n",
    "请同学们自行选择 Hugging Face 或 ModelScope 平台下载 `Qwen/Qwen3-4B` 模型，并加载模型进行推理。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "504369fd",
   "metadata": {},
   "source": [
    "课后作业代码参考：\n",
    "\n",
    "```python\n",
    "from modelscope import snapshot_download, AutoModel, AutoTokenizer\n",
    "\n",
    "model_dir = snapshot_download('Qwen/Qwen3-4B-Instruct-2507', cache_dir='/root/autodl-tmp/model', revision='master')\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "30006ef1",
   "metadata": {},
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "nlp",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
